﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace CenyLetu
{
    /// <summary>
    /// Argumenty při události ZáznamLogu.
    /// </summary>
    class ZaznamLoguEventArgs : EventArgs
    {
        public string Zaznam { get; set; }

        public ZaznamLoguEventArgs(string udalost)
        {
            Zaznam = udalost;
        }

    }

    /// <summary>
    /// Delegát pro událost ZáznamLogu.
    /// </summary>
    /// <param name="sender">Odesílatel zprávy.</param>
    /// <param name="args">Argumenty.</param>
    delegate void ZaznamLoguEventHandler(object sender, ZaznamLoguEventArgs args);

    /// <summary>
    /// Třída pro logování událostí.
    /// </summary>
    class Log : IDisposable
    {
        /// <summary>
        /// Instance singletonu.
        /// </summary>
        private static Log instance;
        /// <summary>
        /// Soubor pro zápis logu.
        /// </summary>
        private StreamWriter streamWriter;
        /// <summary>
        /// Událost ZáznamLogu, nastává při volání logovací operace.
        /// </summary>
        public event ZaznamLoguEventHandler ZaznamLogu;

        /// <summary>
        /// Kontstruktor.
        /// </summary>
        private Log()
        {
            streamWriter = new StreamWriter(File.OpenWrite("cenyletu.log"));
        }

        /// <summary>
        /// Vrací instanci Logu.
        /// </summary>
        /// <returns>Instance třídy Log.</returns>
        public static Log DejInstanci()
        {
            if (instance == null)
                instance = new Log();

            return instance;
        }

        /// <summary>
        /// Zpracování ZáznamLogu eventu.
        /// </summary>
        /// <param name="args">Argumenty eventu.</param>
        private void OnZaznamLogu(ZaznamLoguEventArgs args)
        {
            ZaznamLoguEventHandler eh = ZaznamLogu;
            if (eh == null)
                return;

            eh(this, args);
        }

        /// <summary>
        /// Zapíše událost do log souboru.
        /// </summary>
        /// <param name="udalost">Popis události.</param>
        public void ZapisUdalost(string udalost)
        {
            streamWriter.WriteLine(DateTime.Now + ": " + udalost);

            OnZaznamLogu(new ZaznamLoguEventArgs(udalost));

#if DEBUG
            System.Diagnostics.Debug.WriteLine(udalost);
#endif
        }

        public void Dispose()
        {
            streamWriter.Flush();
            streamWriter.Close();
            streamWriter.Dispose();
        }
    }
}
